ν¨μ¨μ μ΄κ³ μ±λ₯ μ’μ λ λλ§μ μν΄ WebGL μ °μ΄λμ 리μμ€ λ°μΈλ© ν¬μΈνΈλ₯Ό μ΄ν΄νκ³ κ΄λ¦¬νλ μ’ ν© κ°μ΄λμ λλ€.
WebGL μ °μ΄λ 리μμ€ λ°μΈλ© ν¬μΈνΈ: 리μμ€ μ°κ²° κ΄λ¦¬
WebGLμμ μ °μ΄λλ GPUμμ μ€νλλ©° κ°μ²΄κ° λ λλ§λλ λ°©μμ κ²°μ νλ νλ‘κ·Έλ¨μ λλ€. μ΄λ¬ν μ °μ΄λλ ν μ€μ², λ²νΌ, μ λνΌ λ³μμ κ°μ λ€μν 리μμ€μ μ κ·Όν΄μΌ ν©λλ€. 리μμ€ λ°μΈλ© ν¬μΈνΈλ μ΄λ¬ν 리μμ€λ₯Ό μ °μ΄λ νλ‘κ·Έλ¨μ μ°κ²°νλ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ¬ν λ°μΈλ© ν¬μΈνΈλ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ κ²μ WebGL μ ν리μΌμ΄μ μμ μ΅μ μ μ±λ₯κ³Ό μ μ°μ±μ λ¬μ±νλ λ° λ§€μ° μ€μν©λλ€.
리μμ€ λ°μΈλ© ν¬μΈνΈ μ΄ν΄νκΈ°
리μμ€ λ°μΈλ© ν¬μΈνΈλ λ³Έμ§μ μΌλ‘ νΉμ 리μμ€κ° μ°κ²°λλ μ °μ΄λ νλ‘κ·Έλ¨ λ΄μ μΈλ±μ€ λλ μμΉμ λλ€. λ€μν 리μμ€λ₯Ό μ°κ²°ν μ μλ μ΄λ¦μ΄ μ§μ λ μ¬λ‘―μ΄λΌκ³ μκ°νλ©΄ λ©λλ€. μ΄λ¬ν ν¬μΈνΈλ λ μ΄μμ νμ μ(layout qualifier)λ₯Ό μ¬μ©νμ¬ GLSL μ °μ΄λ μ½λμ μ μλ©λλ€. μ΄λ μ °μ΄λκ° μ€νλ λ WebGLμ΄ λ°μ΄ν°μ μ κ·Όνλ μμΉμ λ°©λ²μ μ§μ ν©λλ€.
λ°μΈλ© ν¬μΈνΈκ° μ€μν μ΄μ
- ν¨μ¨μ±: λ°μΈλ© ν¬μΈνΈλ₯Ό μ¬λ°λ₯΄κ² κ΄λ¦¬νλ©΄ 리μμ€ μ κ·Όκ³Ό κ΄λ ¨λ μ€λ²ν€λλ₯Ό ν¬κ² μ€μ¬ λ λλ§ μκ°μ λ¨μΆν μ μμ΅λλ€.
- μ μ°μ±: λ°μΈλ© ν¬μΈνΈλ₯Ό μ¬μ©νλ©΄ μ °μ΄λ μ½λλ₯Ό μμ νμ§ μκ³ λ μ °μ΄λκ° μ¬μ©νλ 리μμ€λ₯Ό λμ μΌλ‘ μ νν μ μμ΅λλ€. μ΄λ λ€μ¬λ€λ₯νκ³ μ μλ ₯ μλ λ λλ§ νμ΄νλΌμΈμ λ§λλ λ° νμμ μ λλ€.
- 체κ³μ±: μ °μ΄λ μ½λλ₯Ό 체κ³μ μΌλ‘ ꡬμ±νκ³ λ€μν 리μμ€κ° μ΄λ»κ² μ¬μ©λλμ§ λ μ½κ² μ΄ν΄ν μ μλλ‘ λμμ€λλ€.
리μμ€ λ° λ°μΈλ© ν¬μΈνΈμ μ ν
WebGLμμλ μ¬λ¬ μ νμ 리μμ€λ₯Ό λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©ν μ μμ΅λλ€:
- ν μ€μ²: νλ©΄ λν μΌ, μμ λλ κΈ°ν μκ°μ μ 보λ₯Ό μ 곡νλ λ° μ¬μ©λλ μ΄λ―Έμ§μ λλ€.
- μ λνΌ λ²νΌ κ°μ²΄(UBOs): ν¨μ¨μ μΌλ‘ μ λ°μ΄νΈν μ μλ μ λνΌ λ³μ λΈλ‘μ λλ€. λ§μ μ λνΌμ ν¨κ» λ³κ²½ν΄μΌ ν λ νΉν μ μ©ν©λλ€.
- μ °μ΄λ μ€ν λ¦¬μ§ λ²νΌ κ°μ²΄(SSBOs): UBOμ μ μ¬νμ§λ§, μ °μ΄λκ° μ½κ³ μΈ μ μλ λλμ λ°μ΄ν°λ₯Ό μν΄ μ€κ³λμμ΅λλ€.
- μνλ¬: ν μ€μ²λ₯Ό μνλ§νλ λ°©λ²(μ: νν°λ§, λ°λ§€ν)μ μ μνλ κ°μ²΄μ λλ€.
ν μ€μ² μ λκ³Ό λ°μΈλ© ν¬μΈνΈ
μμ¬μ μΌλ‘ WebGL 1.0(OpenGL ES 2.0)μ ν
μ€μ² μ λ(μ: gl.TEXTURE0, gl.TEXTURE1)μ μ¬μ©νμ¬ μ΄λ€ ν
μ€μ²λ₯Ό μ
°μ΄λμ μνλ¬μ λ°μΈλ©ν μ§ μ§μ νμ΅λλ€. μ΄ μ κ·Ό λ°©μμ μ¬μ ν μ ν¨νμ§λ§, WebGL 2.0(OpenGL ES 3.0)μμλ λ μ΄μμ νμ μλ₯Ό μ¬μ©νλ λ μ μ°ν λ°μΈλ© ν¬μΈνΈ μμ€ν
μ λμ
νμ΅λλ€.
WebGL 1.0 (OpenGL ES 2.0) - ν μ€μ² μ λ:
WebGL 1.0μμλ ν μ€μ² μ λμ νμ±νν λ€μ ν μ€μ²λ₯Ό λ°μΈλ©ν©λλ€:
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, myTexture);
gl.uniform1i(mySamplerUniformLocation, 0); // 0μ gl.TEXTURE0μ μ°Έμ‘°ν©λλ€
μ °μ΄λμμ:
uniform sampler2D mySampler;
// ...
vec4 color = texture2D(mySampler, uv);
WebGL 2.0 (OpenGL ES 3.0) - λ μ΄μμ νμ μ:
WebGL 2.0μμλ layout νμ μλ₯Ό μ¬μ©νμ¬ μ
°μ΄λ μ½λμμ μ§μ λ°μΈλ© ν¬μΈνΈλ₯Ό μ§μ ν μ μμ΅λλ€:
layout(binding = 0) uniform sampler2D mySampler;
// ...
vec4 color = texture(mySampler, uv);
JavaScript μ½λμμ:
gl.activeTexture(gl.TEXTURE0); // νμ νμν κ²μ μλμ§λ§ μ’μ μ΅κ΄μ
λλ€
gl.bindTexture(gl.TEXTURE_2D, myTexture);
ν΅μ¬μ μΈ μ°¨μ΄μ μ layout(binding = 0)μ΄ μ
°μ΄λμκ² mySampler μνλ¬κ° λ°μΈλ© ν¬μΈνΈ 0μ λ°μΈλ©λμμμ μλ €μ€λ€λ κ²μ
λλ€. μ¬μ ν `gl.bindTexture`λ₯Ό μ¬μ©νμ¬ ν
μ€μ²λ₯Ό λ°μΈλ©ν΄μΌ νμ§λ§, μ
°μ΄λλ λ°μΈλ© ν¬μΈνΈλ₯Ό κΈ°λ°μΌλ‘ μ΄λ€ ν
μ€μ²λ₯Ό μ¬μ©ν΄μΌ νλμ§ μ νν μκ² λ©λλ€.
GLSLμμ λ μ΄μμ νμ μ μ¬μ©νκΈ°
layout νμ μλ WebGL 2.0 μ΄μμμ 리μμ€ λ°μΈλ© ν¬μΈνΈλ₯Ό κ΄λ¦¬νλ ν΅μ¬μ
λλ€. μ΄λ₯Ό ν΅ν΄ μ
°μ΄λ μ½λμμ μ§μ λ°μΈλ© ν¬μΈνΈλ₯Ό μ§μ ν μ μμ΅λλ€.
ꡬ문
layout(binding = , other_qualifiers) ;
binding =: λ°μΈλ© ν¬μΈνΈμ μ μ μΈλ±μ€λ₯Ό μ§μ ν©λλ€. λ°μΈλ© μΈλ±μ€λ λμΌν μ °μ΄λ μ€ν μ΄μ§(λ²ν μ€, νλκ·Έλ¨ΌνΈ λ±) λ΄μμ κ³ μ ν΄μΌ ν©λλ€.other_qualifiers: UBO λ μ΄μμμ μνstd140κ³Ό κ°μ μ νμ νμ μμ λλ€.: 리μμ€μ μ νμ λλ€ (μ:sampler2D,uniform,buffer).: 리μμ€ λ³μμ μ΄λ¦μ λλ€.
μμ
ν μ€μ²
layout(binding = 0) uniform sampler2D diffuseTexture;
layout(binding = 1) uniform sampler2D normalMap;
μ λνΌ λ²νΌ κ°μ²΄ (UBOs)
layout(binding = 2, std140) uniform Matrices {
mat4 modelViewProjectionMatrix;
mat4 normalMatrix;
};
μ °μ΄λ μ€ν λ¦¬μ§ λ²νΌ κ°μ²΄ (SSBOs)
layout(binding = 3) buffer Particles {
vec4 position[ ];
vec4 velocity[ ];
};
JavaScriptμμ λ°μΈλ© ν¬μΈνΈ κ΄λ¦¬νκΈ°
layout νμ μκ° μ
°μ΄λμμ λ°μΈλ© ν¬μΈνΈλ₯Ό μ μνλ λμ, JavaScript μ½λμμλ μ¬μ ν μ€μ 리μμ€λ₯Ό λ°μΈλ©ν΄μΌ ν©λλ€. λ€μμ λ€μν μ νμ 리μμ€λ₯Ό κ΄λ¦¬νλ λ°©λ²μ
λλ€:
ν μ€μ²
gl.activeTexture(gl.TEXTURE0); // ν
μ€μ² μ λ νμ±ν (μ’
μ’
μ ν μ¬νμ΄μ§λ§ κΆμ₯λ¨)
gl.bindTexture(gl.TEXTURE_2D, myDiffuseTexture);
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, myNormalMap);
λ μ΄μμ νμ μλ₯Ό μ¬μ©νλλΌλ, WebGL ν μ€μ² κ°μ²΄λ₯Ό ν μ€μ² μ λκ³Ό μ°κ²°νλ €λ©΄ `gl.activeTexture` λ° `gl.bindTexture` ν¨μκ° μ¬μ ν νμν©λλ€. κ·Έλ¬λ©΄ μ °μ΄λμ `layout` νμ μκ° λ°μΈλ© μΈλ±μ€λ₯Ό κΈ°λ°μΌλ‘ μ΄λ€ ν μ€μ² μ λμμ μνλ§ν μ§ μκ² λ©λλ€.
μ λνΌ λ²νΌ κ°μ²΄ (UBOs)
UBOλ₯Ό κ΄λ¦¬νλ €λ©΄ λ²νΌ κ°μ²΄λ₯Ό μμ±νκ³ , μνλ λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©ν λ€μ, λ²νΌμ λ°μ΄ν°λ₯Ό 볡μ¬ν΄μΌ ν©λλ€.
// UBO μμ±
const ubo = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
gl.bufferData(gl.UNIFORM_BUFFER, bufferData, gl.DYNAMIC_DRAW);
// μ λνΌ λΈλ‘ μΈλ±μ€ κ°μ Έμ€κΈ°
const matricesBlockIndex = gl.getUniformBlockIndex(program, "Matrices");
// UBOλ₯Ό λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©νκΈ°
gl.uniformBlockBinding(program, matricesBlockIndex, 2); // 2λ μ
°μ΄λμ layout(binding = 2)μ ν΄λΉν©λλ€
// λ²νΌλ₯Ό μ λνΌ λ²νΌ νκ²μ λ°μΈλ©νκΈ°
gl.bindBufferBase(gl.UNIFORM_BUFFER, 2, ubo);
μ€λͺ :
- λ²νΌ μμ±: `gl.createBuffer()`λ₯Ό μ¬μ©νμ¬ WebGL λ²νΌ κ°μ²΄λ₯Ό μμ±ν©λλ€.
- λ²νΌ λ°μΈλ©: `gl.bindBuffer()`λ₯Ό μ¬μ©νμ¬ λ²νΌλ₯Ό `gl.UNIFORM_BUFFER` νκ²μ λ°μΈλ©ν©λλ€.
- λ²νΌ λ°μ΄ν°: `gl.bufferData()`λ₯Ό μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ λ²νΌμ λ°μ΄ν°λ₯Ό 볡μ¬ν©λλ€. `bufferData` λ³μλ μΌλ°μ μΌλ‘ νλ ¬ λ°μ΄ν°λ₯Ό ν¬ν¨νλ `Float32Array`μ λλ€.
- λΈλ‘ μΈλ±μ€ κ°μ Έμ€κΈ°: `gl.getUniformBlockIndex()`λ₯Ό μ¬μ©νμ¬ μ °μ΄λ νλ‘κ·Έλ¨μμ "Matrices"λΌλ μ΄λ¦μ μ λνΌ λΈλ‘ μΈλ±μ€λ₯Ό κ²μν©λλ€.
- λ°μΈλ© μ€μ : `gl.uniformBlockBinding()`μ μ¬μ©νμ¬ μ λνΌ λΈλ‘ μΈλ±μ€λ₯Ό λ°μΈλ© ν¬μΈνΈ 2μ μ°κ²°ν©λλ€. μ΄λ WebGLμκ² "Matrices" μ λνΌ λΈλ‘μ΄ λ°μΈλ© ν¬μΈνΈ 2λ₯Ό μ¬μ©ν΄μΌ ν¨μ μλ €μ€λλ€.
- λ²νΌ λ² μ΄μ€ λ°μΈλ©: λ§μ§λ§μΌλ‘, `gl.bindBufferBase()`λ₯Ό μ¬μ©νμ¬ μ€μ UBOλ₯Ό νκ²κ³Ό λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©ν©λλ€. μ΄ λ¨κ³λ UBOλ₯Ό μ °μ΄λμμ μ¬μ©ν μ μλλ‘ λ°μΈλ© ν¬μΈνΈμ μ°κ²°ν©λλ€.
μ °μ΄λ μ€ν λ¦¬μ§ λ²νΌ κ°μ²΄ (SSBOs)
SSBOλ UBOμ μ μ¬νκ² κ΄λ¦¬λμ§λ§ λ€λ₯Έ λ²νΌ νκ²κ³Ό λ°μΈλ© ν¨μλ₯Ό μ¬μ©ν©λλ€.
// SSBO μμ±
const ssbo = gl.createBuffer();
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, ssbo);
gl.bufferData(gl.SHADER_STORAGE_BUFFER, particleData, gl.DYNAMIC_DRAW);
// μ€ν λ¦¬μ§ λΈλ‘ μΈλ±μ€ κ°μ Έμ€κΈ°
const particlesBlockIndex = gl.getProgramResourceIndex(program, gl.SHADER_STORAGE_BLOCK, "Particles");
// SSBOλ₯Ό λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©νκΈ°
gl.shaderStorageBlockBinding(program, particlesBlockIndex, 3); // 3μ μ
°μ΄λμ layout(binding = 3)μ ν΄λΉν©λλ€
// λ²νΌλ₯Ό μ
°μ΄λ μ€ν λ¦¬μ§ λ²νΌ νκ²μ λ°μΈλ©νκΈ°
gl.bindBufferBase(gl.SHADER_STORAGE_BUFFER, 3, ssbo);
μ€λͺ :
- λ²νΌ μμ±: `gl.createBuffer()`λ₯Ό μ¬μ©νμ¬ WebGL λ²νΌ κ°μ²΄λ₯Ό μμ±ν©λλ€.
- λ²νΌ λ°μΈλ©: `gl.bindBuffer()`λ₯Ό μ¬μ©νμ¬ λ²νΌλ₯Ό `gl.SHADER_STORAGE_BUFFER` νκ²μ λ°μΈλ©ν©λλ€.
- λ²νΌ λ°μ΄ν°: `gl.bufferData()`λ₯Ό μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ λ²νΌμ λ°μ΄ν°λ₯Ό 볡μ¬ν©λλ€. `particleData` λ³μλ μΌλ°μ μΌλ‘ νν°ν΄ λ°μ΄ν°λ₯Ό ν¬ν¨νλ `Float32Array`μ λλ€.
- λΈλ‘ μΈλ±μ€ κ°μ Έμ€κΈ°: `gl.getProgramResourceIndex()`λ₯Ό μ¬μ©νμ¬ "Particles"λΌλ μ΄λ¦μ μ °μ΄λ μ€ν λ¦¬μ§ λΈλ‘ μΈλ±μ€λ₯Ό κ²μν©λλ€. 리μμ€ μΈν°νμ΄μ€λ‘ `gl.SHADER_STORAGE_BLOCK`μ μ§μ ν΄μΌ ν©λλ€.
- λ°μΈλ© μ€μ : `gl.shaderStorageBlockBinding()`μ μ¬μ©νμ¬ μ °μ΄λ μ€ν λ¦¬μ§ λΈλ‘ μΈλ±μ€λ₯Ό λ°μΈλ© ν¬μΈνΈ 3μ μ°κ²°ν©λλ€. μ΄λ WebGLμκ² "Particles" μ€ν λ¦¬μ§ λΈλ‘μ΄ λ°μΈλ© ν¬μΈνΈ 3μ μ¬μ©ν΄μΌ ν¨μ μλ €μ€λλ€.
- λ²νΌ λ² μ΄μ€ λ°μΈλ©: λ§μ§λ§μΌλ‘, `gl.bindBufferBase()`λ₯Ό μ¬μ©νμ¬ μ€μ SSBOλ₯Ό νκ²κ³Ό λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©ν©λλ€. μ΄ λ¨κ³λ SSBOλ₯Ό μ °μ΄λμμ μ¬μ©ν μ μλλ‘ λ°μΈλ© ν¬μΈνΈμ μ°κ²°ν©λλ€.
리μμ€ λ°μΈλ© κ΄λ¦¬λ₯Ό μν λͺ¨λ² μ¬λ‘
WebGLμμ 리μμ€ λ°μΈλ© ν¬μΈνΈλ₯Ό κ΄λ¦¬ν λ λ°λΌμΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μΌκ΄λ λ°μΈλ© μΈλ±μ€ μ¬μ©: λͺ¨λ μ °μ΄λμ κ±Έμ³ λ°μΈλ© μΈλ±μ€λ₯Ό ν λΉνλ μΌκ΄λ 체κ³λ₯Ό μ ννμμμ€. μ΄λ κ² νλ©΄ μ½λ μ μ§ κ΄λ¦¬κ° λ μ¬μμ§κ³ μΆ©λ μνμ΄ μ€μ΄λλλ€. μλ₯Ό λ€μ΄, λ°μΈλ© ν¬μΈνΈ 0-9λ ν μ€μ², 10-19λ UBO, 20-29λ SSBOμ©μΌλ‘ μμ½ν μ μμ΅λλ€.
- λ°μΈλ© ν¬μΈνΈ μΆ©λ λ°©μ§: λμΌν μ °μ΄λ μ€ν μ΄μ§ λ΄μμ μ¬λ¬ 리μμ€κ° λμΌν λ°μΈλ© ν¬μΈνΈμ λ°μΈλ©λμ§ μλλ‘ νμμμ€. μ΄λ μ μλμ§ μμ λμμ μ λ°ν μ μμ΅λλ€.
- μν λ³κ²½ μ΅μν: λ€λ₯Έ ν μ€μ²λ UBO κ°μ μ ννλ κ²μ λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€. μν λ³κ²½ νμλ₯Ό μ΅μννλλ‘ λ λλ§ μμ μ ꡬμ±νμμμ€. λμΌν 리μμ€ μΈνΈλ₯Ό μ¬μ©νλ κ°μ²΄λ₯Ό ν¨κ» κ·Έλ£Ήννλ κ²μ κ³ λ €νμμμ€.
- λΉλ²ν μ λνΌ μ λ°μ΄νΈμ UBO μ¬μ©: λ§μ μ λνΌ λ³μλ₯Ό μμ£Ό μ λ°μ΄νΈν΄μΌ νλ κ²½μ°, κ°λ³ μ λνΌμ μ€μ νλ κ²λ³΄λ€ UBOλ₯Ό μ¬μ©νλ κ²μ΄ ν¨μ¬ ν¨μ¨μ μΌ μ μμ΅λλ€. UBOλ₯Ό μ¬μ©νλ©΄ λ¨μΌ λ²νΌ μ λ°μ΄νΈλ‘ μ λνΌ λΈλ‘μ μ λ°μ΄νΈν μ μμ΅λλ€.
- ν μ€μ² λ°°μ΄ κ³ λ €: λΉμ·ν ν μ€μ²λ₯Ό λ§μ΄ μ¬μ©ν΄μΌ νλ κ²½μ° ν μ€μ² λ°°μ΄ μ¬μ©μ κ³ λ €νμμμ€. ν μ€μ² λ°°μ΄μ μ¬μ©νλ©΄ μ¬λ¬ ν μ€μ²λ₯Ό λ¨μΌ ν μ€μ² κ°μ²΄μ μ μ₯ν μ μμ΄ ν μ€μ² κ° μ νκ³Ό κ΄λ ¨λ μ€λ²ν€λλ₯Ό μ€μΌ μ μμ΅λλ€. κ·Έλ¬λ©΄ μ °μ΄λ μ½λλ μ λνΌ λ³μλ₯Ό μ¬μ©νμ¬ λ°°μ΄μ μΈλ±μ±ν μ μμ΅λλ€.
- μ€λͺ μ μΈ μ΄λ¦ μ¬μ©: 리μμ€μ λ°μΈλ© ν¬μΈνΈμ μ€λͺ μ μΈ μ΄λ¦μ μ¬μ©νμ¬ μ½λλ₯Ό λ μ½κ² μ΄ν΄ν μ μλλ‘ νμμμ€. μλ₯Ό λ€μ΄, "texture0" λμ "diffuseTexture"λ₯Ό μ¬μ©νμμμ€.
- λ°μΈλ© ν¬μΈνΈ μ ν¨μ± κ²μ¬: μ격νκ² μꡬλμ§λ μμ§λ§, λ°μΈλ© ν¬μΈνΈκ° μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈνλ μ ν¨μ± κ²μ¬ μ½λλ₯Ό μΆκ°νλ κ²μ κ³ λ €νμμμ€. μ΄λ κ°λ° κ³Όμ μ΄κΈ°μ μ€λ₯λ₯Ό λ°κ²¬νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μ½λ νλ‘νμΌλ§: WebGL νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ λ¦¬μμ€ λ°μΈλ©κ³Ό κ΄λ ¨λ μ±λ₯ λ³λͺ© νμμ μλ³νμμμ€. μ΄λ¬ν λꡬλ 리μμ€ λ°μΈλ© μ λ΅μ΄ μ±λ₯μ λ―ΈμΉλ μν₯μ μ΄ν΄νλ λ° λμμ΄ λ μ μμ΅λλ€.
μΌλ°μ μΈ ν¨μ κ³Ό λ¬Έμ ν΄κ²°
리μμ€ λ°μΈλ© ν¬μΈνΈλ‘ μμ ν λ νΌν΄μΌ ν λͺ κ°μ§ μΌλ°μ μΈ ν¨μ μ λ€μκ³Ό κ°μ΅λλ€:
- μλͺ»λ λ°μΈλ© μΈλ±μ€: κ°μ₯ μΌλ°μ μΈ λ¬Έμ λ μ
°μ΄λλ JavaScript μ½λμμ μλͺ»λ λ°μΈλ© μΈλ±μ€λ₯Ό μ¬μ©νλ κ²μ
λλ€.
layoutνμ μμ μ§μ λ λ°μΈλ© μΈλ±μ€κ° JavaScript μ½λμμ μ¬μ©λ λ°μΈλ© μΈλ±μ€(μ: UBO λλ SSBOλ₯Ό λ°μΈλ©ν λ)μ μΌμΉνλμ§ λ€μ νμΈνμμμ€. - ν μ€μ² μ λ νμ±ν λλ½: λ μ΄μμ νμ μλ₯Ό μ¬μ©ν λμλ ν μ€μ²λ₯Ό λ°μΈλ©νκΈ° μ μ μ¬λ°λ₯Έ ν μ€μ² μ λμ νμ±ννλ κ²μ΄ μ¬μ ν μ€μν©λλ€. WebGLμ΄ λͺ μμ μΌλ‘ ν μ€μ² μ λμ νμ±ννμ§ μμλ λλλ‘ μλν μ μμ§λ§, νμ κ·Έλ κ² νλ κ²μ΄ λͺ¨λ² μ¬λ‘μ λλ€.
- μλͺ»λ λ°μ΄ν° μ ν: JavaScript μ½λμμ μ¬μ©νλ λ°μ΄ν° μ νμ΄ μ °μ΄λ μ½λμ μ μΈλ λ°μ΄ν° μ νκ³Ό μΌμΉνλμ§ νμΈνμμμ€. μλ₯Ό λ€μ΄, UBOμ νλ ¬μ μ λ¬νλ κ²½μ° ν΄λΉ νλ ¬μ΄ `Float32Array`λ‘ μ μ₯λμλμ§ νμΈνμμμ€.
- λ²νΌ λ°μ΄ν° μ λ ¬: UBO λ° SSBOλ₯Ό μ¬μ©ν λ λ°μ΄ν° μ λ ¬ μꡬ μ¬νμ μ μνμμμ€. OpenGL ESλ μ’
μ’
νΉμ λ°μ΄ν° μ νμ΄ νΉμ λ©λͺ¨λ¦¬ κ²½κ³μ μ λ ¬λλλ‘ μꡬν©λλ€.
std140λ μ΄μμ νμ μλ μ μ ν μ λ ¬μ 보μ₯νλ λ° λμμ΄ λμ§λ§, κ·μΉμ μ¬μ ν μκ³ μμ΄μΌ ν©λλ€. νΉν, λΆλ¦¬μΈ λ° μ μ μ νμ μΌλ°μ μΌλ‘ 4λ°μ΄νΈ, λΆλ μμμ μ νμ 4λ°μ΄νΈ, `vec2`λ 8λ°μ΄νΈ, `vec3` λ° `vec4`λ 16λ°μ΄νΈ, νλ ¬μ 16λ°μ΄νΈμ λ°°μμ λλ€. λͺ¨λ λ©€λ²κ° μ¬λ°λ₯΄κ² μ λ ¬λλλ‘ κ΅¬μ‘°μ²΄μ ν¨λ©μ μΆκ°ν μ μμ΅λλ€. - νμ± μνκ° μλ μ λνΌ λΈλ‘: μ λνΌ λΈλ‘(UBO) λλ μ °μ΄λ μ€ν λ¦¬μ§ λΈλ‘(SSBO)μ΄ μ °μ΄λ μ½λμμ μ€μ λ‘ μ¬μ©λλμ§ νμΈνμμμ€. μ»΄νμΌλ¬κ° μ°Έμ‘°λμ§ μμ λΈλ‘μ μ΅μ ννμ¬ μ κ±°νλ©΄ λ°μΈλ©μ΄ μμλλ‘ μλνμ§ μμ μ μμ΅λλ€. λΈλ‘μ λ³μμμ κ°λ¨ν μ½λ κ²λ§μΌλ‘λ μ΄ λ¬Έμ κ° ν΄κ²°λ©λλ€.
- μ€λλ λλΌμ΄λ²: λλλ‘ λ¦¬μμ€ λ°μΈλ© κ΄λ ¨ λ¬Έμ λ μ€λλ κ·Έλν½ λλΌμ΄λ²λ‘ μΈν΄ λ°μν μ μμ΅λλ€. κ·Έλν½ μΉ΄λμ μ΅μ λλΌμ΄λ²κ° μ€μΉλμ΄ μλμ§ νμΈνμμμ€.
λ°μΈλ© ν¬μΈνΈ μ¬μ©μ μ΄μ
- μ±λ₯ ν₯μ: λ°μΈλ© ν¬μΈνΈλ₯Ό λͺ μμ μΌλ‘ μ μν¨μΌλ‘μ¨ WebGL λλΌμ΄λ²κ° 리μμ€ μ κ·Όμ μ΅μ ννλλ‘ λμΈ μ μμ΅λλ€.
- λ¨μνλ μ °μ΄λ κ΄λ¦¬: λ°μΈλ© ν¬μΈνΈλ₯Ό μ¬μ©νλ©΄ μ °μ΄λμ 리μμ€λ₯Ό λ μ½κ² κ΄λ¦¬νκ³ μ λ°μ΄νΈν μ μμ΅λλ€.
- μ μ°μ± μ¦κ°: λ°μΈλ© ν¬μΈνΈλ₯Ό μ¬μ©νλ©΄ μ °μ΄λ μ½λλ₯Ό μμ νμ§ μκ³ λ 리μμ€λ₯Ό λμ μΌλ‘ μ νν μ μμ΅λλ€. μ΄λ 볡μ‘ν λ λλ§ ν¨κ³Όλ₯Ό λ§λλ λ° νΉν μ μ©ν©λλ€.
- λ―Έλ 보μ₯: λ°μΈλ© ν¬μΈνΈ μμ€ν μ ν μ€μ² μ λμλ§ μμ‘΄νλ κ²λ³΄λ€ λ νλμ μΈ λ¦¬μμ€ κ΄λ¦¬ μ κ·Ό λ°©μμ΄λ©°, ν₯ν WebGL λ²μ μμλ μ§μλ κ°λ₯μ±μ΄ λμ΅λλ€.
κ³ κΈ κΈ°λ²
λμ€ν¬λ¦½ν° μΈνΈ (νμ₯ κΈ°λ₯)
μΌλΆ WebGL νμ₯ κΈ°λ₯, νΉν WebGPU κΈ°λ₯κ³Ό κ΄λ ¨λ κ²λ€μ λμ€ν¬λ¦½ν° μΈνΈμ κ°λ μ λμ ν©λλ€. λμ€ν¬λ¦½ν° μΈνΈλ ν¨κ» μ λ°μ΄νΈν μ μλ 리μμ€ λ°μΈλ©μ λͺ¨μμ λλ€. μ΄λ λ§μ μμ 리μμ€λ₯Ό κ΄λ¦¬νλ λ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€. νμ¬ μ΄ κΈ°λ₯μ μ£Όλ‘ μ€νμ μΈ WebGPU ꡬν λ° κ΄λ ¨ μ °μ΄λ μΈμ΄(μ: WGSL)λ₯Ό ν΅ν΄ μ κ·Όν μ μμ΅λλ€.
κ°μ λλ‘μ
κ°μ λλ‘μ κΈ°λ²μ μ’ μ’ λλ‘μ λͺ λ Ήμ μ μ₯νκΈ° μν΄ SSBOμ ν¬κ² μμ‘΄ν©λλ€. μ΄λ¬ν SSBOμ λ°μΈλ© ν¬μΈνΈλ GPUμ λλ‘μ° μ½μ ν¨μ¨μ μΌλ‘ λμ€ν¨μΉνλ λ° μ€μν΄μ§λλ€. μ΄λ 볡μ‘ν λ λλ§ μ ν리μΌμ΄μ μ μμ νλ κ²½μ° νμν κ°μΉκ° μλ κ³ κΈ μ£Όμ μ λλ€.
κ²°λ‘
리μμ€ λ°μΈλ© ν¬μΈνΈλ₯Ό μ΄ν΄νκ³ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ κ²μ ν¨μ¨μ μ΄κ³ μ μ°ν WebGL μ °μ΄λλ₯Ό μμ±νλ λ° νμμ μ λλ€. λ μ΄μμ νμ μ, UBO λ° SSBOλ₯Ό μ¬μ©νλ©΄ 리μμ€ μ κ·Όμ μ΅μ ννκ³ , μ °μ΄λ κ΄λ¦¬λ₯Ό λ¨μννλ©°, λ 볡μ‘νκ³ μ±λ₯ μ’μ λ λλ§ ν¨κ³Όλ₯Ό λ§λ€ μ μμ΅λλ€. λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ , μΌλ°μ μΈ ν¨μ μ νΌνλ©°, μ½λλ₯Ό νλ‘νμΌλ§νμ¬ λ¦¬μμ€ λ°μΈλ© μ λ΅μ΄ ν¨κ³Όμ μΌλ‘ μλνλμ§ νμΈνλ κ²μ μμ§ λ§μμμ€.
WebGLμ΄ κ³μ λ°μ ν¨μ λ°λΌ 리μμ€ λ°μΈλ© ν¬μΈνΈλ λμ± μ€μν΄μ§ κ²μ λλ€. μ΄λ¬ν κΈ°μ μ μλ¬ν¨μΌλ‘μ¨ μ΅μ WebGL λ λλ§ κΈ°μ μ λ°μ μ νμ©ν μ μλ μ€λΉλ₯Ό κ°μΆκ² λ κ²μ λλ€.